// 引入本地存储，用于数据的持久化
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login_API, getUserInfo_API, getUserDetailById_API } from '@/api/user'
import { resetRouter } from '@/router'
// 状态
const state = {
  token: getToken(), // 设置token的共享状态 token持久化，放到缓存中
  userinfo: {} // 用户的基本资料
}
// 修改状态
const mutations = {
  // 设置 token
  setToken_m(state, Newtoken) {
    state.token = Newtoken // 设置token 只是修改state的数据  123=> 1234
    // vuex变化 =>缓存数据
    setToken(Newtoken) // vuex和 缓存数据的同步(注意这个setToken是从auth.js导入的)
  },
  // 删除缓存
  removeToken_m(state) {
    state.token = null // 删除vux的token
    removeToken() // 先清除vuex 再清除缓存vuex 和缓存数据的同步
  },
  // 设置用户信息
  setUserInfo(state, userinfo) {
    state.userinfo = userinfo
  },
  // 删除用户信息
  removeUserInfo(state) {
    state.userinfo = {}
  }
}
// 执行异步
const actions = {
  // 定义login action 也需要参数，调用action时 传递过来的参数
  async login(context, data) {
    // 调用登录接口的api方法
    const res = await login_API(data) // 这个res就是返回的token
    console.log(res)
    // axios 默认给数据加了一层data
    // 表示登录接口调用成功，也就意味着用户名和密码正确
    // action 修改state 必须通过mutations
    context.commit('setToken_m', res)
    // 写入时间戳
    setTimeStamp()
  },
  async getUserInfo(context) {
    const res = await getUserInfo_API() // res就是用户的基本资料
    // 这个接口需要用户的userID,在前一个接口处，我们已经获取到了，所以可以直接在此衔接
    const baseInfo = await getUserDetailById_API(res.userId) // 为了获取头像
    const baseResult = { ...res, ...baseInfo } // 将两个接口结果合并
    // 此时已经获取到了用户的基本资料 迫不得已 为了头像再次调用一个接口
    context.commit('setUserInfo', baseResult) // 将整个的个人信息设置到用户的vuex数据中
    return baseResult // 这里为什么要返回 为后面埋下伏笔
  },
  // 登出的action
  logout(context) {
    // 删除token
    context.commit('removeToken_m') // 不仅删除了vuex中的，还删除了缓存的
    // 删除用户资料
    context.commit('removeUserInfo') // 删除用户信息
    // 重置路由
    resetRouter()
    // 还有一步  vuex中的数据是不是还在，要清空permission模块下的state数据
    // Vuex子模块怎么调用其他子模块的action ， 都没加锁的情况下，可以随意调用
    // 不加命名空间的情况下的，所有的mutations和action都是挂载全局上，所以可以直接调用
    // 但是添加了命名空间的子模块 怎么调用 另一个加了命名空间的子模块的mutations
    // 加了命名空间的context指的不是全局的context
    // mutations名称 载荷 ， 第三个参数{ root: true }，调用根级的mutations或者action
    context.commit('permission/setRoutes', [], { root: true }) // root为true表示将context提升为父模块的实例对象(store下的index.js)
    context.commit('tagsView/delAllViews', null, { root: true }) // 退出时 清空多分页列表
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
